package com.zx.JDK特性.jdk1_8;

import com.zx.JDK特性.jdk1_8.interD.InterfaceDemo1;
import java.util.Comparator;
import java.util.concurrent.Callable;
import org.junit.Test;

/**
 * Lambda表达式的基础语法：Java8引入了一个新的操作符**“->”**，该操作符成为箭头操作符或者Lambda操作符，箭头操作符将Lambda表达式拆分成两部分
 * 左侧：Lambda表达式的参数列表 右侧：Lambda表达式中所需执行的功能，即Lambda体。
 * 简单理解，就是可以优雅的实现接口
 */
public class Lambda1 {

    /**
     * 语法格式一：无参数，无返回值
     */
    @Test
    public void test01() throws Exception {
        // 传统方式
        Runnable r1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("r1");
            }
        };
        // lambda
        Runnable r2 = () -> System.out.println("r2");

        r1.run();
        r2.run();
    }

    /**
     * 语法格式二：有一个参数，并且无返回值 (x) -> System.out.print(x);
     */
    @Test
    public void test02() {
        InterfaceDemo1 i1 = (x) -> System.out.println(x);
        i1.run("i1");
    }

    /**
     * 语法格式三：若只有一个参数，小括号可以省略不写 x -> System.out.print(x);
     */
    @Test
    public void test03() throws Exception {
        InterfaceDemo1 i1 = x -> System.out.println(x);
        i1.run("i1");
    }

    /**
     * 语法格式四：有两个以上的参数，有返回值，并且Lambda体中有多条语句
     */
    @Test
    public void test04() {
        Comparator<Integer> c1 = (x, y) -> {
            System.out.println(String.format("x=%s, y=%s", x, y));
            return Integer.compare(x, y);
        };
        c1.compare(1, 2);
    }

    /**
     * 语法格式五：若Lambda体中只有一条语句，return和大括号都可以省略不写
     *
     * @throws Exception
     */
    @Test
    public void test05() throws Exception {
        // 返回值写法1. 使用{},里面的方法体，使用return进行返回值处理
        Callable<String> c1 = () -> {
            return "c1";
        };
        // 返回值写法2. 方法体在只有一行的情况下,可以省略{}和return
        Callable<String> c2 = () -> "c2";

        System.out.println(c1.call());
        System.out.println(c2.call());
    }

    /**
     * 语法格式六：Lambda表达式的参数列表的数据类型可以省略不写，因为JVM编译器可以通过上下文进行类型推断出数据类型，既“类型推断”。
     * (Integer x,Integer y) -> Integre.compare(x,y);
     *
     * @throws Exception
     * @author: xue.zhang
     * @date 2018年9月28日上午11:01:25
     */
    @Test
    public void test06() throws Exception {
        Comparator<Integer> c1 = (Integer x, Integer y) -> Integer.compare(x, y);
        c1.compare(1, 2);
    }

}
